#include "mysql.h"

Mysql::Mysql(QString hostname,int port,QString dbname,QString username,QString pwd,QString connectionName)
{
    _hostname=hostname;
    _port=port;
    _dbname=dbname;
    _username=username;
    _pwd=pwd;
    _connectionName=connectionName;
    _lastError="no error";
}

bool Mysql::connect()
{
    bool ret=true;
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName(_hostname);
    db.setDatabaseName(_dbname); //这里输入你的数据库名
    db.setUserName(_username);     //用户名
    db.setPassword(_pwd);     //这里输入你的密码
    if (!db.open()) {
        setLastError("mysql连接失败啦，请检查参数 mysql是否启动");
        ret=false;
    }
    return ret;
}

void Mysql::close()
{
    if(db.isOpen()){
        db.close();
    }
}

bool Mysql::insertInto(QString table, QVariantMap dat)
{
    bool ret=true;
    if(db.isOpen()){
        QSqlQuery query(QSqlDatabase::database(_connectionName));
        QString sql = QString("INSERT INTO "+table+"(");

        QVariantMap::Iterator it=dat.begin();
        while(it!=dat.end())
        {
            sql+=it.key();
            if(it.key()!=dat.lastKey())
            {
                sql+=",";
            }
            it++;
        }
        sql+=") VALUES(";
        it=dat.begin();
        while(it!=dat.end())
        {
            if(it.value().type()==QVariant::Int){
                sql+=QString("%1").arg(it.value().toInt());
            }else if(it.value().type()==QVariant::Double){
                sql+=QString("%1").arg(it.value().toDouble());
            }else if(it.value().type()==QVariant::String){
                sql+=it.value().toString();
            }
            if(it.key()!=dat.lastKey())
            {
                sql+=",";
            }
            it++;
        }
        sql+=")";
        setLastSqlString(sql);//记录sql语句;
        if(!query.exec(sql)){
            setLastError("表"+table+"通过id删除数据失败");
            ret = false;
        }
    }else{
        setLastError("数据库未打开 "+db.lastError().text());

        ret = false;
    }
    return ret;
}

bool Mysql::deleteBy(QString table, int id)
{
    bool ret=true;
    if(db.isOpen()){
        QSqlQuery query(QSqlDatabase::database(_connectionName));;
        QString sql = QString("delete from "+table+" where id = %1").arg(id);
        setLastSqlString(sql);//记录sql语句;
        if(!query.exec(sql)){
            setLastError("表"+table+"通过id删除数据失败");
            ret = false;
        }
    }else{
        setLastError("数据库未打开");
        ret = false;
    }
    return ret;
}

bool Mysql::deleteBy(QString table, QString condition)
{
    bool ret=true;
    if(db.isOpen()){
        QSqlQuery query(QSqlDatabase::database(_connectionName));
        QString sql = QString("delete from "+table+" where "+condition);
        if(!query.exec(sql)){
            setLastError("表"+table+"通过条件删除数据失败");
            ret = false;
        }
        setLastSqlString(sql+" 受影响行数"+query.numRowsAffected());//记录sql语句;
    }else{
        setLastError("数据库未打开");
        ret = false;
    }

    return ret;
}

bool Mysql::updateBy(QString table, int id, QVariantMap dat)
{
    bool ret=true;
    if(db.isOpen()){
        QSqlQuery query(QSqlDatabase::database(_connectionName));
        QString sql = QString("UPDATE "+table+" SET ");
        QVariantMap::Iterator it=dat.begin();
        while(it!=dat.end())
        {
            sql+=it.key();
            if(it.value().type()==QVariant::Int){
                sql+=QString("=%1").arg(it.value().toInt());
            }else if(it.value().type()==QVariant::Double){
                sql+=QString("=%1").arg(it.value().toDouble());
            }else if(it.value().type()==QVariant::String){
                sql+="='";
                sql+=it.value().toString();
                sql+="'";
            }
            if(it.key()!=dat.lastKey())
            {
                sql+=",";
            }
            it++;
        }
        sql+=QString(" WHERE id = %1").arg(id);
        setLastSqlString(sql);//记录sql语句;
        if(!query.exec(sql)){
            setLastError("表"+table+"通过id更新失败");
            ret = false;
        }
    }else{
        setLastError("数据库未打开 ");
        ret = false;
    }
    return ret;
}
bool Mysql::updateBy(QString table, QString condition, QVariantMap dat)
{
    bool ret=true;
    if(db.isOpen()){
        QSqlQuery query(QSqlDatabase::database(_connectionName));
        QString sql = QString("UPDATE "+table+" SET ");
        QVariantMap::Iterator it=dat.begin();
        while(it!=dat.end())
        {
            sql+=it.key();
            if(it.value().type()==QVariant::Int){
                sql+=QString("=%1").arg(it.value().toInt());
            }else if(it.value().type()==QVariant::Double){
                sql+=QString("=%1").arg(it.value().toDouble());
            }else if(it.value().type()==QVariant::String){
                sql+="='";
                sql+=it.value().toString();
                sql+="'";
            }
            if(it.key()!=dat.lastKey())
            {
                sql+=",";
            }
            it++;
        }
        sql+=" WHERE ";
        sql+=condition;
        setLastSqlString(sql);//记录sql语句;
        if(!query.exec(sql)){
            setLastError("表"+table+"通过条件更新失败");
            ret = false;
        }
    }else{
        setLastError("数据库未打开 ");
        ret = false;
    }
    return ret;
}

bool Mysql::createTable(QString table, QString content,QString engine,QString charset)
{
    bool ret=true;
    if(db.isOpen()){
        QSqlQuery query(QSqlDatabase::database(_connectionName));
        QString sql = QString("CREATE TABLE IF NOT EXISTS "+table+"(");
        sql+=content;
        sql+=")ENGINE="+engine+" DEFAULT CHARSET="+charset;
        setLastSqlString(sql);//记录sql语句;
        if(!query.exec(sql)){
            setLastError("表"+table+"创建失败失败");
            ret=false;
        }
    }else{
        setLastError("数据库未打开");
    }
    return ret;
}

bool Mysql::dropTable(QString table)
{
    bool ret=true;
    if(db.isOpen()){
        QSqlQuery query(QSqlDatabase::database(_connectionName));
        QString sql = QString("DROP TABLE "+table);
        setLastSqlString(sql);//记录sql语句;
        if(!query.exec(sql)){
            setLastError("表"+table+"删除失败,或不存在");
            ret=false;
        }
    }else{
        setLastError("数据库未打开");
    }
    return ret;
}


//content 例: "id,stu_num,height"//分别对应的是int  int double类型的三个字段
//外部调用该函数时候，返回结果之后再外部遍历即可得到相应字段的数据
//while (query.next())
//{
//    qDebug()<< query.value(0).toInt();
//    qDebug()<< query.value(1).toInt();
//    qDebug()<< query.value(2).toDouble();
//}
QSqlQuery Mysql::selectBy(QString table, QString content, QString condition)
{
    QSqlQuery query(QSqlDatabase::database(_connectionName));
    if(db.isOpen()){
        QString sql = QString("SELECT "+content+" FROM "+table);
        if(condition!=""){
            sql+=+" WHERE "+condition;
        }
        setLastSqlString(sql);//记录sql语句;
        if(!query.exec(sql)){
            setLastError("表"+table+"查询失败");
        }else{
            return query;
        }
    }else{
        setLastError("数据库未打开 ");
    }
    return query;
}

Mysql::~Mysql()
{
    this->close();
}

QString Mysql::lastError() const
{
    return _lastError;
}

void Mysql::setLastError(const QString &lastError)
{
    _lastError = lastError;
}

QString Mysql::lastSqlString() const
{
    return _lastSqlString;
}

void Mysql::setLastSqlString(const QString &lastSqlString)
{
    _lastSqlString = lastSqlString;
}
